/*
******************************************************************************************************* 
**  Copyright (C) 2022, 苏州检易生物科技有限公司 
**  All rights reserved. 
** 
**  FileName:			template_task.h
**  Description:	The module head file template
**  Author:       ZengDa 	 
**  Version				v0.1
**  Date:					2022-04-06
**	Function List： 
**  History:         
*********************************************************************************************************
*/
/*
*********************************************************************************************************
*                                              	防止重复包含
*********************************************************************************************************
*/

#ifndef _SCHEDULE_DEFAULT_H_
#define _SCHEDULE_DEFAULT_H_
/*
*********************************************************************************************************
*                                              	调试开关
*********************************************************************************************************
*/



/*
*********************************************************************************************************
*                                              	头文件
*********************************************************************************************************
*/
#include "schedule_period.h"
#include "app_msg.h"
/*
*********************************************************************************************************
*                                              	宏定义
*********************************************************************************************************
*/

#define MODULE_DEFAULT_WAKEUP					5
/*模块默认消息*/
#define		MSG_DEFAULT_TMR						0x00		/*周期性唤醒信号*/
#define		MSG_DEFAULT_PERIOD_INC		0x01		/*模块周期数增加*/
#define		MSG_DEFAULT_PERIOD_START	0x02		/*模块新周期开始*/
#define		MSG_DEFAULT_ACT_START			0x03		/*执行动作开始*/
#define		MSG_DEFAULT_ACT_FINISH		0x04		/*执行动作完成*/
#define		MSG_DEFAULT_MANUAL_REQ		0x05		/*手动操作请求*/
#define		MSG_DEFAULT_INT_REQ				0x06		/*中断请求*/
#define		MSG_DEFAULT_RESET_REQ			0x07		/*复位请求*/
/*模块默认动作*/
#define		ACT_DEFAULT_RESET						0x00		/*模块默认初始化电机*/
#define		ACT_DEFAULT_ERR_RESET				0x01		/*模块默认错误处理*/
#define		ACT_DEFAULT_MANUAL_ENTER		0x02		/*模块默认进入手动动作*/
#define		ACT_DEFAULT_INTERRUPT				0x03		/*模块默认中断动作*/
#define		ACT_DEFAULT_POUR						0x04		/*模块灌注动作*/
#define		ACT_DEFAULT_SCHEDULE_START	0x80		/*模块默认流程开始动作*/
#define		ACT_DEFAULT_CPLT						0xA0		/*模块默认流程结束动作*/
/*
*********************************************************************************************************
*                                              枚举和结构体类型定义
*********************************************************************************************************
*/

typedef enum{
	MOD_STATUS_DISABLE		=	0,			/*模块关闭使能*/
	MOD_STATUS_UNINIT			=	0x01,		/*模块未初始化*/
	MOD_STATUS_IDLE				= 0x02,		/*模块空闲*/
	MOD_STATUS_SCHEDULE		= 0x03,		/*模块处于流程测试*/
	MOD_STATUS_CALIB			= 0x04,		/*模块调试中*/
	MOD_STATUS_MANUAL			= 0x05,		/*模块手动状态锁定*/
	MOD_STATUS_SWITCH			= 0x06,		/*模块在执行一个动作 完成后将切换状态*/
	MOD_STATUS_ERROR			= 0xFF,		/*fatal err*/
}module_status_t;

typedef enum{
	MOD_TYPE_SYNC,
	MOD_TYPE_ASYNC,
	MOD_TYPE_STANDALONE,
}module_type_t;

typedef struct SCHEDULE_CB{
	struct rt_thread*		p_tcb;
	/*线程邮箱*/
	struct rt_mailbox		mailbox;
	/*主要流程发送列表*/
	list_t		send_list;
	/*错误描述字符串*/
	char*			str_err;
	/*模块状态*/
	module_status_t  	status;
	/*当前模块工作于哪个周期*/
	uint32_t	current_period;
	/*上一个完成的动作*/
	uint8_t		last_action;
	/*手动操作中断请求*/
	uint8_t		manual_req;
	/*周期进位请求 即请求下一个周期开始*/
	uint32_t	period_inc;
	/*周期错误标志位 表示该周期已经放弃*/
	uint8_t		period_offline;
	/*错误计数器*/
	uint8_t		err_cnt;
	/*模块类型 同步模块会在周期结束时同步完成*/
	module_type_t type;
	/*周期超时阈值ms*/
	uint16_t	sch_timeout;
	/*模块初始化锁 该标志位释放了表示该模块将不会影响其他模块初始化*/
	uint8_t		init_lock;
	
	void (*pfn_act_start)(uint8_t act);
	void (*pfn_act_finish)(uint8_t act);
}schedule_cb_t;

typedef enum{
	MODULE_LOCK_INIT,
}module_lock_t;

typedef struct SYSTM_PARA{
	__IO uint8_t	sys_state;
	__IO uint32_t schedule_time;
	__IO uint32_t period_cnt;
	
	uint32_t			pmt_dark;
}system_para_t;

/*
*********************************************************************************************************
*                                              	全局变量声明
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*                                              	函数声明
*********************************************************************************************************
*/
void default_disable_msg_proc(schedule_cb_t * p_tcb,app_msg_t* p_msg);
void default_uninit_msg_proc(schedule_cb_t * p_tcb,app_msg_t* p_msg);
void default_idle_msg_proc(schedule_cb_t * p_tcb,app_msg_t* p_msg);
void default_schedule_msg_proc(schedule_cb_t * p_tcb,app_msg_t* p_msg);
void default_calib_msg_proc(schedule_cb_t * p_tcb,app_msg_t* p_msg);
void default_manual_msg_proc(schedule_cb_t * p_tcb,app_msg_t* p_msg);
void default_switch_msg_proc(schedule_cb_t * p_tcb,app_msg_t* p_msg);
void default_err_msg_proc(schedule_cb_t * p_tcb,app_msg_t* p_msg);

#endif
